// 文件名：firfe_时差天.js

/**
 * 计算两个日期字符串之间的时间差（天数）
 * 支持格式如：2025-01-01, 2025/01/01 12:30:45, 2025.01.05T10:00 等
 * 自动忽略时间部分（时分秒），只取日期部分
 * @param {string} _日期字符串1 - 第一个日期字符串（可含时间）
 * @param {string} _日期字符串2 - 第二个日期字符串（可含时间）
 * @returns {number} 返回 第一个日期 - 第二个日期 的天数差（可为负数）
 */
function fn时差天(_日期字符串1, _日期字符串2) {
  // 内部函数：从字符串中提取日期部分（忽略时间）
  function _提取日期部分(_完整字符串) {
    if (typeof _完整字符串 !== "string") {
      throw new Error("输入必须是字符串");
    }

    // 使用正则匹配开头的日期部分：年-月-日 或 年/月/日 等格式
    // 匹配连续的数字、分隔符，直到遇到空格、T 或时间格式（:）为止
    const _匹配结果 = _完整字符串.trim().match(/^(\d+)[^\d](\d+)[^\d](\d+)/);

    if (!_匹配结果) {
      throw new Error(`无法从输入中解析出日期: ${_完整字符串}`);
    }

    // 提取年、月、日（索引1,2,3对应三个捕获组）
    const _年 = parseInt(_匹配结果[1], 10);
    const _月 = parseInt(_匹配结果[2], 10);
    const _日 = parseInt(_匹配结果[3], 10);

    // 验证是否为有效数字
    if (isNaN(_年) || isNaN(_月) || isNaN(_日)) {
      throw new Error(`日期包含无效数字: ${_完整字符串}`);
    }

    // 创建 Date 对象（月份从0开始）
    const _日期 = new Date(_年, _月 - 1, _日);

    // 验证日期有效性（防止如 2025-02-30 被自动纠正）
    if (
      _日期.getFullYear() !== _年 ||
      _日期.getMonth() !== _月 - 1 ||
      _日期.getDate() !== _日
    ) {
      throw new Error(`无效的日期: ${_完整字符串}`);
    }

    return _日期;
  }

  // 解析两个输入（自动忽略时间部分）
  const _日期1 = _提取日期部分(_日期字符串1);
  const _日期2 = _提取日期部分(_日期字符串2);

  // 计算时间差（毫秒）
  const _时间差毫秒 = _日期1.getTime() - _日期2.getTime();

  // 转换为天数（向下取整，表示完整天数）
  const _天数差 = Math.floor(_时间差毫秒 / (1000 * 60 * 60 * 24));

  return _天数差;
}

// 导出函数
module.exports = fn时差天;
